package com.hdp.kotlin_samples.middle

/**
 * author:hdp
 * on:2019/6/13:9:49
 * desc:
 * 更好调用的函数：显式参数名/默认参数值
 * Kotlin的函数更加好调用，主要是表现在两个方面：
 *
 * 1、具名参数：显式的标示参数名，指定具体是哪个参数的值，可以方便代码阅读和重载
 * 2、函数可以有默认参数值，给与默认值的参数，当不传参的时候，会使用默认值。很方便的实现了函数重载。
 *
 * important:
 *
 * 1、函数有默认值时候，如果是Java代码调用，照样需要写全参数（Java中没有默认值的概念）
 *      为了避免这种问题，可以给函数添加@JvmOverloads注解，这样就会生成一些重载的函数，方便Java代码调用
 */
fun main() {
//    printList()
    printList2()
}


fun <T> joinToString(
    collection: Collection<T>,
    separator: String,
    prefix: String,
    postfix: String
): String {
    val result = StringBuilder(prefix)
    for ((index, element) in collection.withIndex()) {
        if (index > 0) result.append(separator)
        result.append(element)
    }
    result.append(postfix)
    return result.toString()
}

/*
* 测试
 **/
fun printList() {
    val list = listOf(2, 4, 0)
    println("===========具名参数的使用")
    // 不标明参数名
    println(joinToString(list, " - ", "[", "]"))
    // 显式的标明参数名称
    println("具名参数的使用：" + joinToString(list, separator = " - ", prefix = "[", postfix = "]"))
}

/*
* 打印列表的内容，带有默认的参数，可以避免java的函数重载
* */
@JvmOverloads
fun <T> joinToString2(
    collection: Collection<T> = listOf(),
    separator: String = ", ",
    prefix: String = "",
    postfix: String = ""
): String {
    val result = StringBuilder(prefix)
    for ((index, element) in collection.withIndex()) {
        if (index > 0) result.append(separator)
        result.append(element)
    }
    result.append(postfix)
    return result.toString()
}

/*
* 测试
* */
fun printList2() {
    val list = listOf(2, 4, 0)
    println("带默认值的方法调用1：" + joinToString2(list, " - "))
    println("带默认值的方法调用2：" + joinToString2(list, " , ", "["))
    println("带默认值的方法调用3：" + joinToString2(list, " , ", "[", "]"))
    //只指定后缀
    println("带默认值和具名参数同时使用：" + joinToString2(list, postfix = "]"))
}
